#pragma once
#include <cstdio>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "work_task.h"
#include "file_interface.h"
#include "audio_input_interface.h"
#include "opus_encoder.h"
#include "audio_es7210.h"
#include "sd_card.h"
#include <lwip/def.h>
#include <opus_decoder.h>
class App
{
private:
    App();
    ~App(); 
    WorkTask* work_task_=nullptr;
    std::unique_ptr<FileInterface> file_;
    std::unique_ptr<OpusEncoderWrapper> opus_encoder_;
    std::unique_ptr<AudioInputInterface> audio_input_;

    // 定义音频解码器
    std::unique_ptr<OpusDecoderWrapper> opus_decoder_;
    // 在类中定义成员变量存储原始Opus数据包
    std::list<std::vector<uint8_t>> opus_packets_;  // 每个vector是一个Opus包

public:
    static App& GetInstance() {
        // 实例存储在全局静态区（编译期初始化）
        static App instance;
        return instance;
    }
    // 删除拷贝构造函数和赋值运算符
    App(const App&) = delete;
    App& operator=(const App&) = delete; 
    void run();

    void print_all_tasks();
};